#!/bin/bash
# #######################################################################################
#
# Copyright (c) KylinSoft Co., Ltd. 2024. All rights reserved.
# SecureGuardian is licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#     http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
# PURPOSE.
# See the Mulan PSL v2 for more details.
# Description: Security Baseline Check Script for 2.4.7
#
# #######################################################################################

# 修复脚本，确保普通用户不能借助 pkexec 提权 root
# 修复逻辑：
# - 检查 `/etc/polkit-1/rules.d/50-default.rules` 文件是否存在。
# - 如果不存在，创建文件并写入安全配置。
# - 如果存在，检查文件内容是否只允许 `root` 使用 `pkexec`。
# - 修复不符合要求的配置。
# - 自测功能：模拟一个不合规的规则，修复并验证逻辑。

# 使用说明
usage() {
    echo "用法: $0 [--self-test]"
    echo "示例: $0 --self-test"
    echo "默认修复 /etc/polkit-1/rules.d/50-default.rules 文件，确保仅 root 用户可使用 pkexec。"
}

# 初始化参数
SELF_TEST=false

# 解析参数
while [[ $# -gt 0 ]]; do
    case "$1" in
        --self-test)
            SELF_TEST=true
            shift
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        *)
            echo "无效选项: $1"
            usage
            exit 1
            ;;
    esac
done

# Polkit规则文件路径
POLKIT_RULES_FILE="/etc/polkit-1/rules.d/50-default.rules"

# 修复 Polkit 规则
fix_polkit_rules() {
    # 备份原有规则文件
    if [ -f "$POLKIT_RULES_FILE" ]; then
        cp "$POLKIT_RULES_FILE" "${POLKIT_RULES_FILE}.bak.$(date +%F_%T)"
        echo "已备份规则文件: ${POLKIT_RULES_FILE}.bak.$(date +%F_%T)"
    fi

    # 写入安全配置
    cat > "$POLKIT_RULES_FILE" <<EOF
/* -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- */

// DO NOT EDIT THIS FILE, it will be overwritten on update
//
// Default rules for polkit
//
// See the polkit(8) man page for more information
// about configuring polkit.

polkit.addAdminRule(function(action, subject) {
    return ["unix-user:0"];
});
EOF

    echo "修复完成: 确保仅 root 用户可使用 pkexec。"
}

# 自测功能
self_test() {
    echo "自测: 模拟问题场景。"

    # 模拟不合规配置
    echo "创建模拟规则文件..."
    cat > "$POLKIT_RULES_FILE" <<EOF
/* -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- */

polkit.addAdminRule(function(action, subject) {
    return ["unix-user:1000", "unix-user:0"];
});
EOF

    echo "模拟不合规规则文件已创建。"

    # 执行修复
    fix_polkit_rules

    # 检查修复结果
    if grep -q 'unix-user:1000' "$POLKIT_RULES_FILE"; then
        echo "自测失败: 修复逻辑未能删除非 root 用户的规则。"
        return 1
    else
        echo "自测成功: 修复逻辑正确。"
        return 0
    fi
}

# 主函数
main() {
    if [[ "$SELF_TEST" == true ]]; then
        self_test
        exit $?
    fi

    if [ ! -f "$POLKIT_RULES_FILE" ]; then
        echo "规则文件不存在，创建并写入安全配置。"
        fix_polkit_rules
    else
        echo "规则文件已存在，检查并修复配置。"
        fix_polkit_rules
    fi

    exit 0
}

# 执行主函数
main "$@"

